package com.example.democlient.lambda;

import org.junit.jupiter.api.Test;

import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Supplier;

/**
 * 方法引用：若 Lambda体中的内容有方法已经实现了，我们可以使用“方法引用”
 *          （可以理解为方法引用是 Lambda表达式的另一种表现形式）
 *
 *  主要有三种语法格式：
 *   对象::实例方法名
 *   类::静态方法名
 *   类::实例方法名
 *
 * 注意：
 * 1 Lambda 体中调用方法的参数列表与返回值类型，要与函数式接口中抽象方法的
 *   参数列表和返回值类型保持一致
 * 2 若 Lambda参数列表中的第一个参数是 实例方法的调用者，第二个方法时实例方法
 *   的参数时，可以使用 类::实例方法名
 *
 *
 * 构造器引用：
 *    格式：
 *    ClassName::new
 *
 *    注意：需要调用的构造器参数列表要与函数式接口中抽象方法的
 *    参数列表保持一致。
 *
 *
 *
 */

public class TestMethodRef {

    //构造器引用
    @Test
    public void test5(){
        Supplier<Employee> sup = ()-> new Employee();
        Employee employee = sup.get();

        //构造器引用写法：
        Supplier<Employee> sup1 = Employee::new;
        Employee employee1 = sup1.get();
        System.out.println(employee1);

    }





    //类::实例方法名
    @Test
    public void test4(){
        BiPredicate<String,String> bp = (x,y)->x.equals(y);

        BiPredicate<String,String> bp1 = String::equals;
        boolean test = bp1.test("rr", "rr");
        System.out.println(test);

    }




    //类::静态方法名

    @Test
    public void test3(){

        Comparator<Integer> com = (x,y)-> Integer.compare(x,y);

        Integer i = com.compare(1,2);
        System.out.println(i);


        Comparator<Integer> com1 = Integer::compare;
        int compare = com1.compare(3, 2);
        System.out.println(compare);


    }




    //对象::实例方法名
    @Test
    public  void test1(){
        PrintStream ps1 = System.out;
        Consumer<String> con = (x) -> ps1.println(x);

        PrintStream ps = System.out;
        Consumer<String> con1= ps::println;

        con1.accept("ooosss");

    }

    @Test
    public void test2(){
        Employee emp = new Employee();
        Supplier<String> sup = ()->emp.getName();
        String s = sup.get();
        System.out.println(s);

        Supplier<Integer> sup1 = emp::getAge;
        Integer integer = sup1.get();
        System.out.println(integer);

    }




}
